package md;

import java.sql.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.Calendar;
import java.util.List;

/***********************************************************************
 * Module:  Usuario.java
 * Author:  Pamela
 * Purpose: La clase UsuarioMD maneja los datos de la tabla usuario de la BDD
 * version 1.0
 ***********************************************************************/
public class UsuarioMD {

    private int codigoUsuario;
    private int suscripcionUsuario;
    private String nombreUsuario;
    private String nicknameUsuario;
    private String claveUsuario;
    private String fechaIngresoUsuario;

    /**
     * Constructor vacio.
     * Settea los atributos a los valores por defecto
     */
    public UsuarioMD() {
        this.codigoUsuario = -1;
        this.suscripcionUsuario = -1;
        this.nombreUsuario = "";
        this.nicknameUsuario = "";
        this.claveUsuario = "";
        this.fechaIngresoUsuario = "";
    }

    /**
     * Metodo para ingresar un nuevo usuario.
     *
     * @return Devuelve TRUE si es que se ingresa correctamente el registro en
     * la BDD.
     */
    public boolean ingresarUsuarioMD() {

        boolean retorno = false;
        String sql = "";
        //System.out.println("entra al ingresar");

       if (this.suscripcionUsuario != -1 && !this.nombreUsuario.equals("") && !this.nicknameUsuario.equals("") && !this.claveUsuario.equals("") && !this.fechaIngresoUsuario.equals("")) {
            sql = "INSERT INTO \"Usuario\" " +
                    "(\"idSuscripcion\", \"nombreUsuario\", \"nicknameUsuario\", \"claveUsuario\", \"fechaIngresoUsuario\")" +
                    " VALUES (" + this.suscripcionUsuario +
                    ", '" + this.nombreUsuario +
                    "', '" + this.nicknameUsuario +
                    "', '" + this.claveUsuario +
                    "', '" + this.fechaIngresoUsuario + "')";

            System.out.println(sql);
            try {
                Statement stmt = Db.getDb().getConexion().createStatement();
                if (stmt.executeUpdate(sql) > 0) {
                    retorno = true;
                }
                stmt.close();
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }

        return retorno;

    }

    /**
     * Metodo para modificar un usuario.
     *
     * @return Devuelve TRUE si es que se modifica correctamente el registro en
     * la BDD.
     */
    public boolean modificarUsuarioMD() {
        boolean retorno = false;
        String sql = "";
        if (this.suscripcionUsuario != -1 && !this.nombreUsuario.equals("") && !this.nicknameUsuario.equals("") && !this.claveUsuario.equals("")) {
            sql = "UPDATE \"Usuario\" SET" +
                    "\"idSuscripcion\"=" + this.suscripcionUsuario +
                    ", \"nombreUsuario\"=\'" + this.nombreUsuario + "\'" +
                    ", \"nicknameUsuario\"=\'" + this.nicknameUsuario + "\'" +
                    ", \"claveUsuario\"=\'" + this.claveUsuario + "\'" +
                    ", \"fechaIngresoUsuario\"=\'" + this.fechaIngresoUsuario + "\'" +
                    " WHERE \"codigoUsuario\"=" + this.codigoUsuario;

           // System.out.println(sql);
            try {
                Statement stmt = Db.getDb().getConexion().createStatement();
                if (stmt.executeUpdate(sql) > 0) {
                    retorno = true;
                }
                stmt.close();
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
        return retorno;
    }

    /**
     * Metodo para eliminar un usuario.
     *
     * @return Devuelve TRUE si es que se elimina correctamente el registro en
     * la BDD.
     */
    public boolean eliminarUsuarioMD() {

        boolean retorno = false;
        String sql = "";
        if (this.codigoUsuario != -1 && verificarUsuarioMD() == true) {
            sql = "DELETE FROM \"Usuario\"" +
                    " WHERE \"codigoUsuario\"=" + this.codigoUsuario;
            System.out.println(sql);
            try {
                Statement stmt = Db.getDb().getConexion().createStatement();
                if (stmt.executeUpdate(sql) > 0) {
                    retorno = true;
                }
                stmt.close();
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
        return retorno;

    }

    /**
     * Consulta todos los datos del usuario en forma general
     */
    public List consultarUsuarioMD() {

        List<String[]> retorno = new ArrayList<String[]>();

        String sql = "SELECT \"codigoUsuario\", \"idSuscripcion\", \"nombreUsuario\", \"nicknameUsuario\", \"claveUsuario\", \"fechaIngresoUsuario\"" +
                " FROM \"Usuario\"" +
                " ORDER BY \"codigoUsuario\"";

        //System.out.println(sql);
        try {
            Statement stmt = Db.getDb().getConexion().createStatement();
            ResultSet rset = stmt.executeQuery(sql);
            while (rset.next()) {

                String[] arr = {rset.getString("codigoUsuario"),
                    rset.getString("idSuscripcion"),
                    rset.getString("nombreUsuario"),
                    rset.getString("nicknameUsuario"),
                    rset.getString("claveUsuario"),
                    rset.getString("fechaIngresoUsuario")};
                retorno.add(arr);
            }
            System.out.println(retorno);
            stmt.close();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

        return retorno;

    }

    /**
     * Verifica si el usuario existe o no en la BBD.
     *
     * @return Devuelve TRUE si el usuario existe en la BDD.
     */
    public boolean verificarUsuarioMD() {
        boolean retorno = false;

        String sql = "";
        if (this.codigoUsuario != -1) {
            sql = "Select * FROM \"Usuario\"" +
                    " WHERE \"codigoUsuario\"=" + this.codigoUsuario;
            //System.out.println(sql);
            try {
                Statement stmt = Db.getDb().getConexion().createStatement();
                ResultSet rs = stmt.executeQuery(sql);
                while (rs.next()) {
                    retorno = true;
                }
                stmt.close();
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
        return retorno;

    }

    public String[] regresarDatos() {

        String[] retorno = new String[6];
        try {

            String sql = "";

            sql = "Select * FROM \"Usuario\"" +
                    " WHERE \"codigoUsuario\"=" + this.codigoUsuario;
            //System.out.println(sql);
            Statement stmt = Db.getDb().getConexion().createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            while (rs.next()) {
                retorno[0] = rs.getString("codigoUsuario");
                retorno[1] = rs.getString("idSuscripcion");
                retorno[2] = rs.getString("nombreUsuario");
                retorno[3] = rs.getString("nicknameUsuario");
                retorno[4] = rs.getString("claveUsuario");
                retorno[5] = rs.getString("fechaIngresoUsuario");
            }
            stmt.close();
        } catch (SQLException ex) {
            System.out.println("No se ha podido ejecutar la sentencia SQL");
        }

        return retorno;

    }

    /**
     * Verifica el nickname y la contrasena para el ingreso al
     * sistema por parte del usuario
     *
     *  @return Devuelve TRUE si el usuario existe en
     * la BDD.
     */
    public boolean validarIngresoUsuarioMD() {
        // TODO: implement
        boolean retorno = false;
        String sql = "";
        ResultSet rs = null;

        sql = "Select * FROM \"Usuario\"" +
                " WHERE \"nicknameUsuario\"='" + this.nicknameUsuario + "' AND \"claveUsuario\"='" + this.claveUsuario + "'";

        try {
            Statement stmt = Db.getDb().getConexion().createStatement();
            rs = stmt.executeQuery(sql);
            while (rs.next()) {
                retorno = true;
                this.codigoUsuario = rs.getInt("codigoUsuario");
                this.nombreUsuario = rs.getString("nombreUsuario");
            }
            stmt.close();
        } catch (SQLException e) {
        }

        if (retorno == true) {
            return true;
        } else {
            return false;
        }

    }

    /***************************************
     * Getters & Setters
     ***************************************/
    public int getCodigoUsuario() {
        return codigoUsuario;
    }

    public int getSuscripcionUsuario() {
        return suscripcionUsuario;
    }

    public String getNombreUsuario() {
        return nombreUsuario;
    }

    public String getNicknameUsuario() {
        return nicknameUsuario;
    }

    public String getClaveUsuario() {
        return claveUsuario;
    }

    public String getFechaIngresoUsuario() {
        return fechaIngresoUsuario;
    }

    public void setCodigoUsuario(int newCodigoUsuario) {
        codigoUsuario = newCodigoUsuario;
    }

    public void setSuscripcionUsuario(int newSuscripcionUsuario) {
        suscripcionUsuario = newSuscripcionUsuario;
    }

    public void setNombreUsuario(String newNombreUsuario) {
        nombreUsuario = newNombreUsuario;
    }

    public void setNicknameUsuario(String newNicknameUsuario) {
        nicknameUsuario = newNicknameUsuario;
    }

    public void setClaveUsuario(String newClaveUsuario) {
        claveUsuario = newClaveUsuario;
    }

    public void setFechaIngresoUsuario(String newFechaIngresoUsuario) {
        fechaIngresoUsuario = newFechaIngresoUsuario;
    }
}

